package shapes.shapes2D.distribution.random 
{
	/**
	 * ...
	 * @author Nicolas Barradeau
	 * http://en.nicoptere.net
	 */
	public class Random2
	{
		
		public function Random2() 
		{
			
		}
		// 普通のランダム。
        public function normalRandom():Number{
            return Math.random();
        }
        
        // 平方ランダム。
        public function powerRandom():Number{
            return Math.pow(Math.random(), 2);
        }
        
        // 平方ランダムその２。
        public function powerRandom2():Number{
            return Math.random()*Math.random();
        }
        
        // 平方根ランダム。
        public function sqrtRandom():Number{
            return Math.sqrt(Math.random());
        }
        
        // ２ランダムの和。
        public function plusRandom2():Number{
            return (Math.random()+Math.random())/2
        }
        
        // ３ランダムの和。
        public function plusRandom3():Number{
            return (Math.random()+Math.random()+Math.random())/3
        }
        
        // 指定割合ランダム
        public function oddsRandom_0():Number{
            var odds:Array = [5, 10, 10, 20, 10, 8, 5, 0, 10, 20];
            return oddsRandom(odds) / odds.length;    // グラフ描画の関係上、１以下の数にして返す。
        }
        /* 
            指定割合ランダム
            指定された配列の割合に沿って整数値を返す。
        */
        public static function oddsRandom(arg:Array):int{
            if (arg.length == 0) return 0;
            var maxNum:Number = 0;
            var i:int;
            for (i = 0; i < arg.length; i++){
                if (isNaN(arg[i])) continue;
                maxNum += arg[i];
            }
            var mainRandom:Number = int(Math.random()*maxNum);
            for (i = 0; i < arg.length; i++){
                if (isNaN(arg[i])) continue;
                
                mainRandom -= arg[i];
                if (mainRandom < 0){
                    return i;
                }
            }
            return -1;    // 数値なしError
        }
        
        // 変形4平方ランダム。balance=0.5 velvet=0.3
        public function transRandom4_0():Number{
            return transRandom4(0.5, 0.3);
        }
        // 変形4平方ランダム。balance=0.3 velvet=0.6
        public function transRandom4_1():Number{
            return transRandom4(0.3, 0.6);
        }
        // 変形4平方ランダム。balance=1.0 velvet=0.5
        public function transRandom4_2():Number{
            return transRandom4(1.0, 0.5);
        }
        /* 
           変形4平方ランダム。
           値に沿ってrandomの割合を変換して返す。
           中心点に設定した部分が一番確率が高く、両脇の確率がほぼ０になる。
           
           balance - 中心点の位置。0～1で指定する。省略すれば0.5
           velvet  - なだらかさ。0～1で指定する。
           　　　　　0で尖った形（人←こんなん）、0.2で３角形、0.3で正規分布に近く、
           　　　　　0.5～0.7でドーム型、0.9で台形になり、1は普通のランダムと同じ一様な分布となる
           　　　　　省略すれば0.3
         */
        public function transRandom4(balance:Number = 0.5, velvet:Number = 0.3):Number{
            var ans:Number;
            var sqrtFunctionY:Number;
            var reBalance:Number;
            var x:Number;
            x = Math.random();
            if (x < balance){
                sqrtFunctionY = sqrt4(x / balance) * balance;
            }else{
                reBalance = 1 - balance;
                sqrtFunctionY= -sqrt4((1 - x)/reBalance) * reBalance + 1;
            }
            ans = sqrtFunctionY*(1 - velvet) + x * velvet;
            return ans;
        }
        private function sqrt4(arg:Number):Number{
            return Math.sqrt(Math.sqrt(arg));
        }
	}

}